package cn.ytxy.double_system_data_visualization_demo.user.controller;


import cn.ytxy.double_system_data_visualization_demo.base.response.JsonResult;
import cn.ytxy.double_system_data_visualization_demo.base.response.StatusCode;
import cn.ytxy.double_system_data_visualization_demo.user.pojo.vo.DepartmentVO;
import cn.ytxy.double_system_data_visualization_demo.user.pojo.vo.UserVO;
import cn.ytxy.double_system_data_visualization_demo.user.service.DepartmentService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import javax.validation.constraints.Pattern;
import java.util.List;

/**
 * @ClassName DepartmentController
 * @Description 部门信息表控制器
 * @Author renhong~Deng
 * @Date 2025/4/30 15:03
 * @Version 1.0
 */
@Slf4j
@Validated
@RestController
@RequestMapping("/v1/departmentinfo")
public class DepartmentController {

    @Resource
    private DepartmentService departmentService;

    /**
     * 使用GET请求获取部门信息
     * 该方法通过部门名称查询具体的部门信息，并返回给前端
     * 主要用于支持前端的部门信息展示或搜索功能
     *
     * @param departmentName 部门名称，作为查询条件传递给后端服务
     * @return 返回一个JsonResult对象，其中包含查询到的部门信息（DepartmentVO）
     */
    @ApiOperation("查询部门信息")
    @GetMapping("/select2departmentName")
    public JsonResult selectDepartment(String departmentName) {
        // 控制日志输出长度，防止日志过大或注入攻击
        String safeLogName = departmentName != null && departmentName.length() > 100 ?
                departmentName.substring(0, 100) : (departmentName == null ? "null" : departmentName);
        log.info("查询部门: {}", safeLogName);

        // 如果 departmentName 为空字符串，则传 null 给 service，表示查询全部
        List<DepartmentVO> departmentVOS = departmentService.selectDepartment(
                (departmentName == null || departmentName.isEmpty()) ? null : departmentName
        );

        // 返回查询结果
        return JsonResult.ok(departmentVOS);
    }




    /**
     * 添加部门接口
     *
     * @param departmentName 部门名称，限制为1到10个中文字符
     *                       //     * @param session        当前会话，用于验证用户登录状态
     * @return JsonResult 返回操作结果，包括操作状态和提示信息
     */
    @ApiOperation("添加部门")
    @PostMapping("/addDepartment")
    public JsonResult addDepartment(
            @RequestParam(required = false) String departmentName) {


        // 校验 departmentName 是否为空
        if (departmentName == null || departmentName.trim().isEmpty()) {
            return new JsonResult(StatusCode.VALIDATE_ERROR, "部门名称不能为空");
        }

        // 去除前后空格
        departmentName = departmentName.trim();

        // 调用服务层方法添加部门（建议 service 内部校验是否已存在同名部门）
        departmentService.addDepartment(departmentName);

        // 返回操作成功的结果
        return JsonResult.ok();
    }


    @ApiOperation("修改部门")
    @PostMapping("/editDepartment")
    public JsonResult editDepartment(
            @Param("oldDepartmentName") String oldDepartmentName,
            @Param("newDepartmentName") String newDepartmentName) {

        // 参数校验
        if (oldDepartmentName == null || oldDepartmentName.trim().isEmpty()) {
            return new JsonResult(StatusCode.OPERATION_FAILED, "原部门名称不能为空");
        }
        if (newDepartmentName == null || newDepartmentName.trim().isEmpty()) {
            return new JsonResult(StatusCode.OPERATION_FAILED, "新部门名称不能为空");
        }

        log.info("修改部门: {} -> {}", oldDepartmentName, newDepartmentName);
        departmentService.editDepartment(oldDepartmentName, newDepartmentName);
        return JsonResult.ok("部门修改成功");
    }


    /**
     * 删除部门接口
     * 该方法允许通过POST请求删除指定的部门
     * 需要部门名称作为参数，并且会检查session中是否存在有效用户信息
     *
     * @param departmentName 部门名称，用于标识要删除的部门
     * @param session        HttpSession对象，用于校验用户是否已登录
     * @return JsonResult 返回删除结果，包括状态码和消息
     */
    @ApiOperation("删除部门")
    @PostMapping("/deleteDepartment")
    public JsonResult deleteDepartment(@RequestParam String departmentName, @ApiIgnore HttpSession session) {
        // 校验 session 是否存在有效用户信息
        Object usernameObj = session.getAttribute("username");
        if (usernameObj == null) {
            return new JsonResult(StatusCode.NOT_LOGIN, "用户未登录，请先登录");
        }
        String username = usernameObj.toString();

        // 校验部门名称是否为空
        if (departmentName == null || departmentName.trim().isEmpty()) {
            return new JsonResult(StatusCode.OPERATION_FAILED, "部门名称不能为空");
        }

        // 记录删除部门的日志信息，包含操作人
        log.info("用户 [{}] 正在删除部门: {}", username, departmentName);

        // 调用部门服务的删除方法
        departmentService.deleteDepartment(departmentName);

        // 返回删除成功的结果
        return JsonResult.ok();
    }

    /**
     * 给该部门所有人添加积分
     */
    @ApiOperation("该部门所有人添加积分")
    @PostMapping("/addDepartmentScore")
    public JsonResult addDepartmentScore(@RequestParam String departmentName, @RequestParam Integer departmentScore, @RequestParam String reason) {
        // 记录部门积分添加日志
        log.info("为部门 {} 添加积分: {}, 原因: {}", departmentName, departmentScore, reason);
        // 调用 service 方法为部门所有人添加积分
        departmentService.addDepartmentScore(departmentName, departmentScore, reason);
        // 返回成功结果
        return JsonResult.ok();
    }

    /**
     * 给该部门所有人添加减分
     */
    @ApiOperation("该部门所有人减少积分")
    @PostMapping("/subtractDepartmentScore")
    public JsonResult subtractDepartmentScore(@RequestParam String departmentName, @RequestParam Integer departmentScore, @RequestParam String reason) {
        // 记录部门积分添加日志
        log.info("为部门 {} 减少积分: {}, 原因: {}", departmentName, departmentScore, reason);
        // 调用 service 方法为部门所有人添加积分
        departmentService.subtractDepartmentScore(departmentName, departmentScore, reason);
        // 返回成功结果
        return JsonResult.ok();
    }


    @ApiOperation("查询部门名称信息")
    @GetMapping("/selectDepartmentName")
    public JsonResult selectDepartment() {
        return JsonResult.ok(departmentService.selectDepartmentName());
    }
}
